package com.thn.news.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.thn.news.model.News;
import com.thn.news.service.NewsService;
import com.thn.news.mapper.NewsMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.client.producer.SendStatus;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;

/**
* @author jzg
* @description 针对表【news】的数据库操作Service实现
* @createDate 2025-07-14 14:50:23
*/
@Slf4j
@Service
public class NewsServiceImpl extends ServiceImpl<NewsMapper, News>
    implements NewsService{

    private final RocketMQTemplate rocketMQTemplate;

    // 注入RocketMQTemplate
    public NewsServiceImpl(RocketMQTemplate rocketMQTemplate) {
        this.rocketMQTemplate = rocketMQTemplate;
    }

    /**
     * 发送普通消息
     *
     * 适用场景：不需要顺序保证、事务处理的普通业务通知
     * 例如：订单创建通知、库存更新通知等
     *
     * @param topic 消息主题
     * @param tag   消息标签（用于消息过滤）
     * @param content 消息内容
     */
    public void sendNormalMessage(String topic, String tag, News content) {
        // 构建完整目的地（主题:标签）
        String destination = topic + ":" + tag;

        // 创建Spring Messaging Message对象
        Message<News> message = MessageBuilder.withPayload(content)
                // 设置业务键（用于追踪）
                .setHeader("KEYS", "news_id_" + content.getId())
                // 设置其他自定义属性
                .setHeader("business_type", "news_created")
                .build();


        // 发送消息（同步方式）
        SendResult sendResult = rocketMQTemplate.syncSend(destination, message);
        if(sendResult.getSendStatus() == SendStatus.SEND_OK) {
            log.info("普通消息发送成功: {}, 消息ID: {}", destination, sendResult.getMsgId());
        }else {
            log.error("普通消息发送失败: {}, 失败状态: {}", destination, sendResult.getSendStatus());
        }



        // 异步发送示例（适合高吞吐场景）
        /*
        rocketMQTemplate.asyncSend(destination, message, new SendCallback() {
            @Override
            public void onSuccess(SendResult sendResult) {
                System.out.println("异步发送成功: " + sendResult.getMsgId());
            }
            @Override
            public void onException(Throwable throwable) {
                System.err.println("异步发送失败: " + throwable.getMessage());
            }
        });
        */
    }

    /**
     * 发送延时消息
     * 适用场景：需要延迟处理的业务场景
     * 例如：订单支付超时、库存冻结时长、定时任务等
     *
     * @param topic 延时消息主题
     * @param tag   延时消息标签（用于消息过滤）
     */
    public void sendDelayMessage(String topic, String tag, News content, long delay) {
        // 构建完整目的地（主题:标签）
        String destination = topic + ":" + tag;

        // 创建Spring Messaging Message对象
        Message<News> message = MessageBuilder.withPayload(content)
                // 设置业务键（用于追踪）
                .setHeader("KEYS", "news_id_" + content.getId())
                // 设置其他自定义属性
                .setHeader("business_type", "news_created")
                .build();

        SendResult result;
        // 发送延迟消息毫秒级（需要Broker配置，enableScheduleTimeMessage = true）
        //result = rocketMQTemplate.syncSendDelayTimeMills(destination, message, delay);
        // 发送延迟消息秒级（最大延迟2小时）
        result = rocketMQTemplate.syncSendDelayTimeSeconds(destination, message, delay);
        // 延迟消息指定时间戳
       // result = rocketMQTemplate.syncSendDeliverTimeMills(destination, message, delay);
        if(result.getSendStatus() == SendStatus.SEND_OK) {
            log.info("延迟消息发送成功: {}, 消息ID: {}", destination, result.getMsgId());
        }else {
            log.error("延迟消息发送失败: {}, 失败状态: {}", destination, result.getSendStatus());
        }
    }
}




